package com.quique.pfc.utils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.http.util.ByteArrayBuffer;

import android.content.Context;
import android.util.Log;

/** Esta clase contendra metodos estaticos relacionados con la 
 * lectura / escritura de ficheros en la aplicacion */
public class FileUtils 
{
	/** Contexto de la aplicacion */
	public static Context ctx;
	
	/** Devuelve el nombre con el que se almacenara el fichero en el sistema
	 * de archivos del telefono.
	 * Nombre = md5(servidor_moodle)_idModulo_nombreFichero*/
	public static String calcularNombreFichero(String url, int idModulo, String nombreFichero)
	throws Exception
	{
		String result = md5(url) + "_" + String.valueOf(idModulo) + "_" + nombreFichero;
		return result;
	}
	
	/**
	 * Devuelve el archivo almacenado en el sistema de ficheros del telefono
	 * cuyo path coincide con el parametro o null si no existe.
	 * @param path - Ruta del fichero.
	 * @return - File con el descriptor del fichero y null si no existe u ocurre
	 * algun error durante el proceso.
	 */
	public static File obtenerFichero(String path)
	{
		try
		{
			File f = new File(ctx.getFilesDir(), path);
			return f;

		}
		catch(Exception e)
		{
			Log.e("moodle", "Error obteniendo el fichero: " + path);
			return null;
		}
	}
	
	/** Almacena el archivo en el sistema de ficheros de la aplicacion */
	public static void guardarFichero(String url, int idModulo, String nombreFichero, byte[] contenido)
	throws Exception
	{
		String nombre = md5(url) + "_" + String.valueOf(idModulo) + "_" + nombreFichero;
		FileOutputStream fos = ctx.openFileOutput(nombre, Context.MODE_WORLD_READABLE);
		fos.write(contenido);
		fos.close();
	}
	/** Obtiene el fichero de la URl que se le pasa como parametro */
	public static byte[] bajarFichero(String direccion)
	throws Exception
	{
		URL url = new URL(direccion);
		URLConnection conn = url.openConnection();
		InputStream is = conn.getInputStream();
		BufferedInputStream bis = new BufferedInputStream(is);
		ByteArrayBuffer bab = new ByteArrayBuffer(64);
		int current = 0;
		while((current = bis.read()) != -1)
		{
		         bab.append((byte)current);
		}
		byte[] result = bab.toByteArray();
		return result;
	}
	/** Indica si el fichero cuyo nombre se pasa como parametro esta en el sistema de archivos
	 * del telefono. */
	public static boolean existeFichero(String nombre)
	{
		FileInputStream fis = null;
		try
		{
			fis = ctx.openFileInput(nombre);
			if(fis != null) return true;
			return false;
		}
		catch(Exception e)
		{
			//Log.e("moodle", "Error al acceder al fichero: " + nombre + ". No se puede acceder o no existe");
			return false;
		}
		finally
		{
			if(fis!= null) try { fis.close(); } catch(Exception e){}
		}
	}
	
	/** Calculo del hash*/
	private static String md5(String s) {
	    try {
	        // Create MD5 Hash
	        MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
	        digest.update(s.getBytes());
	        byte messageDigest[] = digest.digest();
	        
	        // Create Hex String
	        StringBuffer hexString = new StringBuffer();
	        for (int i=0; i<messageDigest.length; i++)
	            hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
	        return hexString.toString();
	        
	    } catch (NoSuchAlgorithmException e) {
	        e.printStackTrace();
	    }
	    return "";
	}
	
}
